package cn.calm.commons.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import cn.calm.commons.entity.BaseEntity;
import cn.calm.commons.entity.PageMode;

public interface IBaseDao {
	/**
	 * 将t对象插入到数据库中<br/>
	 * 如果该对象是逻辑删除类型则将对象的DeleteClass设置为<code>LogicallyDelete.DELETECLASS_NORMAL</code>
	 * @param t
	 */
	<T extends BaseEntity>void insert(T t);

	/**
	 * 将t对象更新到数据库中
	 * @param t
	 */
	<T extends BaseEntity>void modify(T t);

	/**
	 * 将t对象从数据库中删除
	 * @param t
	 */
	<T extends BaseEntity>void delete(T t);

	/**
	 * 根据检索条件query返回符合条件的clazz类型的对象集合
	 * @param clazz 返回实体的类型
	 * @param query 检索条件
	 * @return 根据检索条件query返回符合条件的clazz类型的对象集合
	 */
	<T extends BaseEntity>List<T> list(Class<? extends BaseEntity> clazz, QueryConditionBuilder<T> query);

	/**
	 * @param clazz 返回实体的类型
	 * @param pk 主键
	 * @return 根据主键返回clazz类型的对象
	 */
	<T extends BaseEntity>T load(Class<?> clazz, Serializable pk);
	
//	/**
//	 * @param clazz 返回实体的类型
//	 * @param property
//	 * @param dependencies
//	 * @return
//	 */
//	public <T extends BaseEntity>List<T> listInByProperty(final Class<T> clazz,final String property, final String[] dependencies);
	
//	public <T extends BaseEntity>List<T> listByProperty(final Class<?> clazz,final String property, final Object  value);
	
//	public String getMax(final Class<?> clazz,final String property);
	
	void exceHQL(String string, Map<String, Object> parameter);

//	<T extends BaseEntity>void merge(T t);
	
	public <T extends BaseEntity>PageMode listPage(PageMode t, Class<? extends BaseEntity> clazz, QueryConditionBuilder<T> query);
	
	public EntityManager getSession() ;

	public void setSession(EntityManager session) ;
}

